home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 53696 / 53696.xpi / chrome / content / locator.js < prev    next >
Text File  |  2009-12-18  |  12KB  |  451 lines

  1. String.prototype.ltrim = function String$ltrim() { var re = /\s*((\S+\s*)*)/; return this.replace(re, "$1"); }
  2. String.prototype.rtrim = function String$rtrim() { var re = /((\s*\S+)*)\s*/; return this.replace(re, "$1"); }
  3. String.prototype.trim = function String$trim() { return this.ltrim(this.rtrim()); }
  4.  
  5. var SPACING = 200,
  6.     FS_DESKTOP = 0,
  7.     FS_PERSONAL = 1,
  8.     FS_PHOTOS = 2,
  9.     FS_MUSIC = 3,
  10.     FS_VIDEOS = 4,
  11.     FS_DOCS = 5,
  12.     FS_BOOKMARKS = 6,
  13.     FS_SITES = 7;
  14.  
  15. var EMPTY_GUID = "00000000-0000-0000-0000-000000000000",
  16.     DESKTOP_ASSET_ID = "10000001-1001-1001-1001-100000000001",
  17.     SYSTEM_ASSET_ID_PERSONAL = "00000000-0000-0000-0001-000000000000",
  18.     SYSTEM_ASSET_ID_PHOTOS = "00000000-0000-0001-0001-000000000000",
  19.     SYSTEM_ASSET_ID_MUSIC = "00000000-0000-0001-0002-000000000000",
  20.     SYSTEM_ASSET_ID_VIDEOS = "00000000-0000-0001-0003-000000000000",
  21.     SYSTEM_ASSET_ID_DOCS = "00000000-0000-0001-0004-000000000000",
  22.     SYSTEM_ASSET_ID_BOOKMARKS = "00000000-0000-0001-0005-000000000000";
  23.  
  24. var prompt = null;
  25. var glideSession = null;
  26. var invokeService = null;
  27. var ENDPOINT_FS = null;
  28. var sync = false;
  29.  
  30. var columns = null;
  31. var currentColumn = null;
  32. var currentItem = null;
  33. var newId = null;
  34. var loadIndicator = null;
  35.  
  36. function hideLoadIndicator() {
  37.     var i = document.getElementById("column_load_indicator");
  38.     
  39.     if (i)
  40.         document.getElementById("locator_columns").removeChild(i);
  41. }
  42.  
  43. function showLoadIndicator() {
  44.     var i = document.getElementById("column_load_indicator");
  45.  
  46.     if (i)
  47.         return;
  48.  
  49.     var lc = document.getElementById("locator_columns");
  50.     
  51.     lc.appendChild(loadIndicator);
  52.     lc.boxObject.QueryInterface(Components.interfaces.nsIScrollBoxObject).ensureElementIsVisible(loadIndicator);
  53. }
  54.  
  55. function renderColumn(col) {
  56.     var box = document.createElement("listbox");
  57.  
  58.     box.id = "locator_column_" + col.index;
  59.     box.setAttribute("rel", col.index);
  60.     box.addEventListener("select", function() { itemSelected(this); }, false);
  61.     
  62.     var item = null;
  63.     var title = "";
  64.     var listitem = null;
  65.     var selectedIndex = -1;
  66.  
  67.     for (var i = 0; i < col.items.length; i++) {
  68.         item = col.items[i];
  69.  
  70.         listitem = document.createElement("listitem");//box.appendItem(item.title, item.assetid);
  71.  
  72.         listitem.setAttribute("label", item.title);
  73.         listitem.setAttribute("value", item.assetid);
  74.         listitem.setAttribute("class", "listitem-iconic");
  75.  
  76.         if (item.syncEnabled)
  77.             listitem.setAttribute("label", item.title + " (sync enabled)");
  78.  
  79.         if (item.syncEnabled)
  80.             listitem.setAttribute("image", "chrome://glide/content/images/icon_sync.png");
  81.  
  82.         if (newId != null && item.assetId != null && newId.toLowerCase() == item.assetId.toLowerCase()) {
  83.             selectedIndex = i;
  84.         }
  85.  
  86.         box.appendChild(listitem);
  87.     }
  88.  
  89.     var lc = document.getElementById("locator_columns");
  90.  
  91.     lc.appendChild(box);
  92.     lc.boxObject.QueryInterface(Components.interfaces.nsIScrollBoxObject).ensureElementIsVisible(box);
  93.  
  94.     if (selectedIndex > 0)
  95.     {
  96.         box.selectedIndex = selectedIndex;
  97.         box.focus();
  98.     }
  99.         
  100.     newId = null;
  101. }
  102.  
  103. function removeColumnsAfter(index) {
  104.     var ch = document.getElementById("locator_columns");
  105.     var na = new Array();
  106.  
  107.     for (var i = 0; i < columns.length; i++) {
  108.         if (i > index)
  109.             ch.removeChild(document.getElementById("locator_column_" + i));
  110.         else
  111.             na.push(columns[i]);
  112.     }
  113.  
  114.     columns = na;
  115. }
  116.  
  117. function itemSelected(who) {
  118.     document.documentElement.getButton("accept").disabled = false;
  119.     document.documentElement.getButton("extra2").disabled = false;
  120.  
  121.     currentColumn = columns[who.getAttribute("rel")];
  122.     currentItem = currentColumn.items[who.selectedIndex];
  123.  
  124.     if (!currentItem.loadNext)
  125.         return;
  126.  
  127.     removeColumnsAfter(currentColumn.index);
  128.     showLoadIndicator();
  129.  
  130.     currentItem.loadNext(currentItem);
  131. }
  132.  
  133. function addColumn(col) {
  134.     renderColumn(col);
  135.     columns.push(col);
  136. }
  137.  
  138. function makeAssetColumn(data) {
  139.     if (null == data) {
  140.         hideLoadIndicator();
  141.  
  142.         return;
  143.     }
  144.  
  145.     if (!data.success) {
  146.         hideLoadIndicator();
  147.  
  148.         alert(data.message);
  149.  
  150.         return;
  151.     }
  152.  
  153.     var items = new Array();
  154.     var item = null;
  155.     var results = data.items;
  156.     var r = null;
  157.  
  158.     for (var i = 0; i < results.length; i++) {
  159.         r = results[i];
  160.  
  161.         item = {
  162.             assetId: r.assetId,
  163.             title: r.title,
  164.             loadNext: null,
  165.             enableNewFolder: true,
  166.             selectable: true,
  167.             syncEnabled: r.syncEnabled
  168.         };
  169.  
  170.         if (currentItem.subtype)
  171.             item.subtype = currentItem.subtype;
  172.  
  173.         if ("Container" == r.assetClass || "Conversation" == r.assetClass || "Webmail" == r.assetClass || "Chat" == r.assetClass) {
  174.             if ("Mail" == r.metadataClass)
  175.                 item.loadNext = function(w) { loadEmailBox(false, w.assetId); };
  176.             else
  177.                 item.loadNext = function(w) { loadAssetLocation(w); };
  178.         }
  179.         else if ("Project" == r.assetClass) {
  180.             item.loadNext = function(w) { loadGroupBox(false, w.assetId); };
  181.         }
  182.  
  183.         items.push(item);
  184.     }
  185.  
  186.     hideLoadIndicator();
  187.  
  188.     document.documentElement.getButton("accept").disabled = !currentItem.selectable;
  189.     document.documentElement.getButton("extra2").disabled = !currentItem.enableNewFolder;
  190.  
  191.     addColumn({
  192.         index: currentColumn.index + 1,
  193.         items: items
  194.     });
  195. }
  196.  
  197. function loadAssetLocation(who) {
  198.     invokeService(ENDPOINT_FS, "getfolders", false, { token: glideSession.token, id: who.assetId }, makeAssetColumn);
  199. }
  200.  
  201. function loadGroupBox(inbox, parentId) {
  202.     var data = {
  203.         token: glideSession.token,
  204.         type: inbox ? "inbox" : "outbox"
  205.     };
  206.  
  207.     if (parentId)
  208.         data.parentId = parentId;
  209.  
  210.     invokeService(ENDPOINT_FS, "getgroupbox", false, data, makeAssetColumn);
  211. }
  212.  
  213. function loadGroups() {
  214.     hideLoadIndicator();
  215.  
  216.     addColumn({
  217.         index: currentColumn.index + 1,
  218.         items: [{ title: "Inbox", assetId: null, loadNext: function() { loadGroupBox(true); }, enableNewFolder: false, selectable: false }, { title: "Outbox", assetId: null, loadNext: function() { loadGroupBox(false); }, enableNewFolder: false, selectable: false}]
  219.     });
  220. }
  221.  
  222. function loadEngageBox(sent) {
  223.     invokeService(ENDPOINT_FS, "getengagebox", false, { token: glideSession.token, type: sent ? "outbox" : "inbox" }, makeAssetColumn);
  224. }
  225.  
  226. function loadEngageGroups() {
  227.     hideLoadIndicator();
  228.  
  229.     addColumn({
  230.         index: currentColumn.index + 1,
  231.         items: [{ title: "Inbox", assetId: null, loadNext: function() { loadEngageBox(true); }, enableNewFolder: false, selectable: false }, { title: "Outbox", assetId: null, loadNext: function() { GlideLocatorColumn_loadEngageBox(false); }, enableNewFolder: false, selectable: false}]
  232.     });
  233. }
  234.  
  235. function loadEmailBox(sent, folderId) {
  236.     var data = {
  237.         token: glideSession.token,
  238.         type: sent ? "sent" : "draft"
  239.     };
  240.  
  241.     if (folderId)
  242.         data.folderId = folderId;
  243.  
  244.     invokeService(ENDPOINT_FS, "getemailbox", false, data, makeAssetColumn);
  245. }
  246.  
  247. function loadEmails() {
  248.     hideLoadIndicator();
  249.  
  250.     addColumn({
  251.         index: currentColumn.index + 1,
  252.         items: [{ title: "Last 200 Sent", assetId: null, loadNext: function() { loadEmailBox(true); }, enableNewFolder: false, selectable: false }, { title: "Drafts", assetId: null, loadNext: function() { loadEmailBox(false); }, enableNewFolder: false, selectable: false}]
  253.     });
  254. }
  255.  
  256. function loadMeetingBox(inbox) {
  257.     invokeService(ENDPOINT_FS, "getmeetingbox", false, { token: glideSession.token, type: inbox ? "inbox" : "outbox" }, makeAssetColumn);
  258. }
  259.  
  260. function loadMeetings() {
  261.     hideLoadIndicator();
  262.  
  263.     addColumn({
  264.         index: currentColumn.index + 1,
  265.         items: [{ title: "Inbox", assetId: null, loadNext: function() { loadMeetingBox(true); }, enableNewFolder: false, selectable: false }, { title: "Outbox", assetId: null, loadNext: function() { loadMeetingBox(false); }, enableNewFolder: false, selectable: false}]
  266.     });
  267. }
  268.  
  269. function loadRootLocation(id) {
  270.     if (FS_DESKTOP == id) {
  271.         invokeService(ENDPOINT_FS, "getdesktopfolders", false, { token: glideSession.token }, makeAssetColumn);
  272.  
  273.         return;
  274.     }
  275.  
  276.     var guid = SYSTEM_ASSET_ID_PERSONAL;
  277.  
  278.     switch (id) {
  279.         case FS_PERSONAL: break;
  280.         case FS_PHOTOS: guid = SYSTEM_ASSET_ID_PHOTOS; break;
  281.         case FS_MUSIC: guid = SYSTEM_ASSET_ID_MUSIC; break;
  282.         case FS_VIDEOS: guid = SYSTEM_ASSET_ID_VIDEOS; break;
  283.         case FS_DOCS: guid = SYSTEM_ASSET_ID_DOCS; break;
  284.         case FS_BOOKMARKS: guid = SYSTEM_ASSET_ID_BOOKMARKS; break;
  285.  
  286.         default: return;
  287.     }
  288.  
  289.     invokeService(ENDPOINT_FS, "getrootfolder", false, { token: glideSession.token, id: guid }, makeAssetColumn);
  290. }
  291.  
  292. function newFolder() {
  293.     var name = { value: "" };
  294.  
  295.     if (!prompt.prompt(null, "New Folder", "Please enter the name of the new folder:", name, "", {}))
  296.         return;
  297.  
  298.     name.value = name.value.trim();
  299.  
  300.     removeColumnsAfter(currentColumn.index);
  301.     showLoadIndicator();
  302.  
  303.     document.documentElement.getButton("accept").disabled = true;
  304.     document.documentElement.getButton("extra2").disabled = true;
  305.     
  306.     var data = {
  307.         token: glideSession.token,
  308.         name: name.value,
  309.         sync: sync,
  310.         parentId: currentItem.assetId,
  311.     };
  312.     
  313.     if (currentItem.subtype)
  314.         data.subtype = currentItem.subtype;
  315.     
  316.     invokeService(ENDPOINT_FS, "createfolder", false, data, function(d) {
  317.         if (d.success) {
  318.             newId = d.value;
  319.             currentItem.loadNext(currentItem);
  320.         } else {
  321.             hideLoadIndicator();
  322.             alert(d.message);
  323.         }
  324.     });
  325. }
  326.  
  327. function glideLocatorDialog_Load() {
  328.     prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  329.     glideSession = window.arguments[0].inn.glideSession;
  330.     invokeService = window.arguments[0].inn.invokeService;
  331.     ENDPOINT_FS = window.arguments[0].inn.ENDPOINT_FS;
  332.     sync = window.arguments[0].inn.sync;
  333.     columns = new Array();
  334.  
  335.     document.getElementById("glide-locator-instruction").textContent = "Please choose the " + (sync ? "Sync" : "") + " destination where you would like to save this item:";
  336.  
  337.     loadIndicator = document.getElementById("column_load_indicator");
  338.     document.getElementById("locator_columns").removeChild(loadIndicator);
  339.  
  340.     var c = {
  341.         index: 0,
  342.         items: new Array()
  343.     };
  344.  
  345.     c.items.push({
  346.         title: "Desktop",
  347.         assetId: DESKTOP_ASSET_ID,
  348.         loadNext: function() { loadRootLocation(FS_DESKTOP); },
  349.         enableNewFolder: true,
  350.         selectable: !sync,
  351.         subtype: "Personal"
  352.     });
  353.     
  354.     c.items.push({
  355.         title: glideSession.fullName,
  356.         assetId: null,
  357.         loadNext: function() { loadRootLocation(FS_PERSONAL); },
  358.         enableNewFolder: true,
  359.         selectable: !sync,
  360.         subtype: "Personal"
  361.     });
  362.     
  363.     c.items.push({
  364.         title: "Photos",
  365.         assetId: null,
  366.         loadNext: function() { loadRootLocation(FS_PHOTOS); },
  367.         enableNewFolder: true,
  368.         selectable: !sync,
  369.         subtype: "Image"
  370.     });
  371.     
  372.     c.items.push({
  373.         title: "Music",
  374.         assetId: null,
  375.         loadNext: function() { loadRootLocation(FS_MUSIC); },
  376.         enableNewFolder: true,
  377.         selectable: !sync,
  378.         subtype: "Audio"
  379.     });
  380.     
  381.     c.items.push({
  382.         title: "Videos",
  383.         assetId: null,
  384.         loadNext: function() { loadRootLocation(FS_VIDEOS); },
  385.         enableNewFolder: true,
  386.         selectable: !sync,
  387.         subtype: "Video"
  388.     });
  389.     
  390.     c.items.push({
  391.         title: "Documents",
  392.         assetId: null,
  393.         loadNext: function() { loadRootLocation(FS_DOCS); },
  394.         enableNewFolder: true,
  395.         selectable: !sync,
  396.         subtype: "Document"
  397.     });
  398.     
  399.     c.items.push({
  400.         title: "Bookmarks",
  401.         assetId: null,
  402.         loadNext: function() { loadRootLocation(FS_BOOKMARKS); },
  403.         enableNewFolder: true,
  404.         selectable: !sync,
  405.         subtype: "Url"
  406.     });
  407.     
  408.     c.items.push({
  409.         title: "Engage Discussions",
  410.         assetId: null,
  411.         loadNext: function() { loadEngageGroups(); },
  412.         enableNewFolder: false,
  413.         selectable: false
  414.     });
  415.     
  416.     c.items.push({
  417.         title: "Emails",
  418.         assetId: null,
  419.         loadNext: function() { loadEmails(); },
  420.         enableNewFolder: false,
  421.         selectable: false
  422.     });
  423.     
  424.     c.items.push({
  425.         title: "Groups",
  426.         assetId: null,
  427.         loadNext: function() { loadGroups(); },
  428.         enableNewFolder: false,
  429.         selectable: false
  430.     });
  431.     
  432.     c.items.push({
  433.         title: "Meetings",
  434.         assetId: null,
  435.         loadNext: function() { loadMeetings(); },
  436.         enableNewFolder: false,
  437.         selectable: false
  438.     });
  439.  
  440.     addColumn(c);
  441.  
  442.     document.documentElement.getButton("accept").disabled = true;
  443.     document.documentElement.getButton("extra2").disabled = true;
  444. }
  445.  
  446. function glideLocatorDialog_Accept() {
  447.     window.arguments[0].out = { value: currentItem.assetId };
  448.     
  449.     return true;
  450. }
  451.